package py.una.pol.ii.is2.facade.flota;


/**
 * Clase que implementa la interfaz ModeloFacade
 * @author mbenitez
 * @date 03/05/2009
 */

import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import py.una.pol.ii.is2.dao.flota.MarcaDAOLocal;
import py.una.pol.ii.is2.dao.flota.MarcaModeloDAO;
import py.una.pol.ii.is2.dao.flota.ModeloDAO;
import py.una.pol.ii.is2.domain.flota.Marca;
import py.una.pol.ii.is2.domain.flota.MarcaModelo;
import py.una.pol.ii.is2.domain.flota.MarcaModeloPK;
import py.una.pol.ii.is2.domain.flota.Modelo;

@Stateless
public class ModeloFacadeBean implements ModeloFacade {
    /**
     * Manejador de instancias de entidades para recuperar instancias desde
     * el Persistence Context
     */
    @PersistenceContext
    private EntityManager em;
    @EJB
    private ModeloDAO modeloDao;
    @EJB
    private MarcaDAOLocal marcaDao;
    @EJB
    private MarcaModeloDAO marcaModeloDao;
    private Modelo modelo;
    private MarcaModelo marcaModelo;
    /**
     * Inserta una entidad de Modelo en la base de datos. 
     *
     * @param nombre Nombre del Modelo a insertar
     * @param descripcion Descripción del Modelo a insertar
     * @param codMarca Código de la marca a la cual corresponde el Modelo a insertar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean insert(String nombre, String descripcion, Integer codMarca) throws Exception {
        boolean retorno = false;
        Marca marca = null;
        try {
            modelo = new Modelo();
            marca = marcaDao.find(codMarca);
            modelo.setModeDescripcion(descripcion);
            modelo.setModeNombre(nombre);
            marcaModelo = new MarcaModelo(marca.getMarcCod(), modelo.getModeCod());
            marcaModeloDao.insert(marcaModelo);
            retorno = true;
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }

    /**
     * Actualiza una entidad de Modelo, recibida como parámetro,
     * en la base de datos. 
     * @param nombre Nombre del Modelo a insertar
     * @param descripcion Descripción del Modelo a insertar
     * @param codModelo
     * @param codMarca Código de la marca a la cual corresponde el Modelo a insertar
     * @param codMarcaModelo
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean update(String nombre, String descripcion, Integer codModelo, Integer codMarca, MarcaModeloPK codMarcaModelo) throws Exception {
        boolean retorno = false;
        try {
            // se elimina el registro de la tabla
            marcaModelo = marcaModeloDao.find(codMarcaModelo);
            marcaModeloDao.delete(marcaModelo);

            // se inserta el registro con valores actualizados
            marcaModelo = new MarcaModelo(codMarca, codModelo);
            marcaModeloDao.insert(marcaModelo);

            // se actualizan los datos del modelo
            modelo = modeloDao.find(codModelo);
            modelo.setModeDescripcion(descripcion);
            modelo.setModeNombre(nombre);
            modeloDao.update(modelo);

            retorno = true;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }finally{
            return retorno;
        }
    }

    /**
     * Elimina una entidad de Modelo, recibida como parámetro,
     * en la base de datos.
     *
     * @param objeto Elemento a eliminar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean delete(Integer objeto) throws Exception {
        boolean retorno = false;
        try {
            modelo = modeloDao.find(objeto);
//            if(modelo.getMarcaModeloCollection().size() <= 1){
                Object mgdObjeto = em.merge(modelo);
                em.remove(mgdObjeto);
                retorno = true;
//            }
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }finally{
            return retorno;
        }
    }

    /**
     * Devuelve todos los Modelos con sus respectivas marcas en caso de que el parámetro condicion
     * sea o bien <b>null</b> o <b>vacio</b>, y aquellas que coincidan con la condicion
     * comenzando con la palabra clave <b>where</b>.
     * Las entidades son devueltas ordenadas por la clave primaria.
     *
     *
     * @param condicion Restricción para la selección de resultados
     * @return retorno Lista de resultados arrojados por la ejecución de la consulta, en otro caso null.
     * @throws java.lang.Exception
     */
    public List<MarcaModelo> getListaModeloConMarca(String condicion) throws Exception {
        List<MarcaModelo> retorno = null;
        try {
            // recuperamos la lista
            retorno = marcaModeloDao.getListaMarcaModelos(condicion);
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }
}
